由于移动端众所周知的click 300ms延迟的缘故(用户碰触页面之后,需要等待一段时间来判断是不是双击(double tap)动作,而不是立即响应单击(click),等待的这段时间大约是300ms)。移动事件提供了touchstart
、touchmove
、touchend
,却没有提供对tap
的支持。许多主流框架都是自定义实现了tap事件,消除300ms的延迟,当然包括Zepto.js。
关于点击穿透的解决方案可以查看: 移动页面点击穿透问题解决方案。
此外,使用原生的touch事件也存在点击穿透的问题,因为click是在touch系列事件发生后大约300ms才触发的,混用touch和click肯定会导致点透问题。所以在移动端我们有必要使用类似Zepto.js的tap事件。
代码挂在我的github上,对应文件夹v0.8.1。
https://github.com/zrysmt/DIY-zepto
1.源码
1 |
|
2.源码分析
核心层分是把事件绑定到$(document)
上分别进行处理
1 | $(document) |
1 | // 触发scroll时取消所有事件处理动作 |
tap
事件是通过touch
事件模拟的
- tap —元素tap的时候触发。
- singleTap and doubleTap — 这一对事件可以用来检测元素上的单击和双击。(如果你不需要检测单击、双击,使用 tap 代替)。
- longTap — 当一个元素被按住超过750ms触发。
- swipe, swipeLeft, swipeRight, swipeUp, swipeDown — 当元素被划过时触发。(可选择给定的方向)
1 | if (deltaX < 30 && deltaY < 30) { |
Zepto的touch模块也只实现了tap和swipe相关的动作,不支持复杂手势,需要支持复杂手势的话,可以使用 hammer.js ,hammer提供了完善的一整套手势支持( 注意 :hammer也存在点击穿透问题,仍然需要手动处理该问题)
代码挂在我的github上,对应文件夹v0.8.1。
https://github.com/zrysmt/DIY-zepto
参考阅读: